<?php
class ProjectTask {
    
    private $ptid;
    private $pid;
    public  $name;
    public  $description;
    public  $priority;
    private $done;
    private $dateCreated;
    public  $dateStart;
    public  $dateEnd;
    private $dateDone;
    private $uid;
    
    public function getPtid() {
        return $this->ptid;
    }

    public function getPid() {
        return $this->pid;
    }

    public function getDone() {
        return $this->done;
    }

    public function getDateCreated() {
        return $this->dateCreated;
    }

    public function getDateDone() {
        return $this->dateDone;
    }

    public function getUser() {
        return $this->uid;
    }
    
    public function __construct($ptid=0) {
        if($ptid < 1) {
            return;
        }
        $data = ProjectDAO::getTaskInfo($ptid);
        if(!count($data)) {
            $this->ptid = 0;
            return;
        }
        $this->setData($data);
    }
    
    
    public function addTask($project) {
        if(!ProjectDAO::exists($project)) {
            $err = Error::instance();
            $err->add("Podany projekt nie istnieje.");
            return false;
        }
        if(strlen($this->name) < 1) {
            $err = Error::instance();
            $err->add("Nazwa zadania nie może być pusta.");
        }
        if(strlen($this->description) < 1) {
            $err = Error::instance();
            $err->add("Opis zadanie nie może być pusty.");
        }
        if(!(int)$this->priority) {
            $err = Error::instance();
            $err->add("Priorytet musi być liczbą dodatnią.");
        }
        if(ProjectDAO::taskExists($project, $this->name)) {
            $err = Error::instance();
            $err->add("Zadanie o podanej nazwie istnieje już w tym projekcie.");
        }
        $this->checkDates($project);
        
        $err = Error::instance();
        if($err->count()) {
            return false;
        }
        $this->done = 0;
        $this->pid = $project->getPid();
        if(($this->ptid = ProjectDAO::createTask($this)) > 0) {
            return true;
        } else {
            return false;
        }
    }
    
    public function updateTask() {
        if($this->ptid < 1) {
            return false;
        }
        $project = new Project((int)$this->pid);
        $this->checkDates($project);
        
        $err = Error::instance();
        if($err->count()) {
            return false;
        }
        return ProjectDAO::updateTask($this);
    }
    
    public function checkDates() {
        $startDate = strtotime($this->dateStart);
        $projectStartDate = strtotime($project->dateStart);
        $endDate = strtotime($this->dateEnd);
        $projectEndDate = strtotime($project->dateEnd);
        if($startDate != 0 && $startDate < $projectStartDate) {
            $err = Error::instance();
            $err->add("Zadanie nie może rozpoczynać się wcześniej niż projekt, do którego jest przypisane.");
        }
        if($endDate > $projectEndDate && $projectEndDate != 0) {
            $err = Error::instance();
            $err->add("Zadanie nie może kończyć się później niż projekt, do którego jest przypisane.");
        }
    }
    
    public function closeTask() {
        if($this->ptid< 1) {
            return false;
        }
        if($this->done) {
            $err = Error::instance();
            $err->add("Zadanie już zostalo zamknięte.");
            return false;
        }
        if(ProjectDAO::taskAtProgress($this)) {
            $err = Error::instance();
            $err->add("Zadanie jest w trakcie wykonywania.");
            return false;
        }
        $this->dateDone = date("Y-m-d H:i:s");
        $this->done = 1;
        return ProjectDAO::updateTask($this);
    }
    
    public function deleteTask() {
        if($this->ptid< 1) {
            return false;
        }
        if(ProjectDAO::taskAtProgress($this)) {
            $err = Error::instance();
            $err->add("Zadanie jest w trakcie wykonywania.");
            return false;
        }
        ProjectDAO::removeWorks($this);
        ProjectDAO::removeSignedUsers($this);
        return ProjectDAO::removeTask($this);
    }
    
    public function assignUser($user) {
        if($this->ptid< 1) {
            return false;
        }
        
        if($this->uid > 0) {
            if(!$this->removeUser()) {
                return false;
            }
        }
        $this->uid = $user->getUid();
        return $this->updateTask();
    }
    
    public function removeUser() {
        if($this->ptid< 1) {
            return false;
        }
        if($this->uid < 1) {
            $err = Error::instance();
            $err->add("Zadanie nie posiada przypisanego użytkownika.");
            return false;
        }
        if(ProjectDAO::taskAtProgress($this)) {
            $err = Error::instance();
            $err->add("Zadanie jest w trakcie wykonywania.");
            return false;
        }
        return ProjectDAO::removeSignedUsers($this);
    }
    
    public function atProgress() {
        return ProjectDAO::taskAtProgress($this);
    }
    
    private function setData($data) {
        foreach($data as $key => $val) {
            if(property_exists(get_class($this),$key)) {
                $this->$key = $val;
            }
        }
    }
    
    public function setNewTaskData($data) {
        foreach($data as $key => $val) {
            if( property_exists(get_class($this),$key) &&
                $key != 'uid' &&
                $key != 'ptid' &&
                $key != 'pid' &&
                $key != 'done' &&
                $key != 'dateDone' &&
                $key != 'dateCreated'
            ) {
                $this->$key = $val;
            }
        }
    }
}

?>
